-- KEYS[1] 是用于存储响应时间和状态的zset的键
-- ARGV[1] 是错误率阈值（百分比）
-- ARGV[2] 是绝对响应时间阈值（毫秒）
-- ARGV[3] 是时间窗口大小（毫秒）

local key = KEYS[1]
local errorRateThreshold = tonumber(ARGV[1])
local absRTThreshold = tonumber(ARGV[2])
local window = tonumber(ARGV[3])
local now = tonumber(ARGV[4])
local start = now - window

-- 获取时间窗口内的所有成员 移除非当前时间的

redis.call('ZREMRANGEBYSCORE', key, '-inf', start)
local members = redis.call("ZRANGE",key, 0, -1)

-- 计算错误率
local errCount = 0
local totalReqs = #members
for i, member in ipairs(members) do
    local status = string.split(member, ':')[2]
    if status == 'error' then
        errCount = errCount + 1
    end
end
local errorRate = (errCount / totalReqs) * 100

-- 检查错误率是否超过阈值
if errorRate > errorRateThreshold then
    return "true"
end

-- 如果没有成员，则不能计算增长和阈值检查
if #members < 1 then
    return "false"
end

-- 检查连续5分钟内是否所有请求的响应时间都超过了阈值
local allOverThreshold = true
for i, member in ipairs(members) do
    local timestamp = tonumber(string.split(member, ':')[1])
    local rt = tonumber(string.split(member, ':')[2])
    if rt > absRTThreshold then
        allOverThreshold = false
        break
    end
end

-- 如果所有请求都超过阈值，触发限流
if allOverThreshold then
    return "true"
end

-- 没有触发限流
return "false"